package com.itheima.springbootwebtlias.aspect;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

@Slf4j
@Aspect
@Component
public class AspectExecution {

    /*
       切入点表达式写法一：方法的签名定位方法
          execution(修饰符   返回类型  包名.类名.方法（参数） throws 异常)

          1.完整写法：execution(public com.itheima.springbootwebtlias.pojo.Result com.itheima.springbootwebtlias.controller.DeptController.removeById(java.lang.Integer))throws java.lang.NullPointerException)")
          2. 修饰符可以省略，表示任意修饰符
             包名，类名可以省略，表示任意包名，类名（不推荐，影响效率）
             异常类型可以省略，表示任意异常
          3.execution可以使用逻辑运算符：&& || !
          execution(com.itheima.springbootwebtlias.pojo.Result com.itheima.springbootwebtlias.controller.DeptController.removeById(java.lang.Integer)) +
          || execution(com.itheima.springbootwebtlias.pojo.Result com.itheima.springbootwebtlias.controller.DeptController.update(com.itheima.springbootwebtlias.pojo.Dept))
          4.execution可以使用通配符匹配多个切入点方法
            *：任意单个字符，返回值，包名，类名，方法名，参数类型
               包/类/方法名称一部分
               execution(*  com.*.springbootwebtlias.controller.*Controller.*(*))
           ..: 任意多个连续的字符，任意层级的包，任意的类型/任意数量的参数（包括无参）
               execution(*  com..controller.DeptController.*(..))
           5.注意：不推荐大量使用通配符，会影响效率，尽量使用精确的切入点表达式
               execution(*  *..*.*(..))
    */
    // @Pointcut("execution(void com.itheima.springbootwebtlias.service.impl.*ServiceImpl.remove*(*))")

    /*
       切入点表达式写法二：指定的注解，匹配目标方法
       @annotation(自定义注解)
    */


    @Pointcut("execution(void com.itheima.springbootwebtlias.service.impl.*ServiceImpl.remove*(*))   &&   @annotation(com.itheima.springbootwebtlias.anno.MyLog)")
    public void gk(){}

    @Before("gk()")
    public void before()
    {
        log.info("before... ...");
    }

}
